package net.zjitc.linearlist.impl;

import net.zjitc.linearlist.MyLinearList;

/**
 * Created by Administrator on 2017/3/9.
 */
/*链表存储方式实现线性表*/
public class MyLinkList<E> implements MyLinearList<E>{
    //定义一个变量引用，用来指向第一个结点，也就是说找到这个链表
    private Node<E> start;
    //记录当前链表的结点的个数
    private int size;

    @Override
    public void add(E e) {
     //如果当前的链表本身没有结点，添加的结点应该是第一个结点//

        if (size == 0){
            Node<E> newNode = new Node<E>(e,null);
             start = newNode;
             size++;
        }
     //如果当前链表有节点，怎么增加？
        /*
        1.先把新的元素构造成一个新结点，新结点的next为null;
           使用Node构造函数实现构造一个新的结点
           */
         Node<E> newNode = new Node<E>(e,null);

       // 2.从链表的开头进行查询，直到找到当前链表的最后一个结点
           //首先定义一个变量c,让c指向链表的头结点，表示当前结点
        Node<E> c;
        c = start;
        /*循环判断当前结点c是否指向下一个结点
           如果当前结点c的next为空，则c为最后一个结点,
           否则将下c的下一个结点c.next赋值给c变成当前结点
        * */
        while (c.next != null){
            c = c.next;
        }

       // 3.把新结点赋值给原来链表的最后一个结点的next
          c.next = newNode;
        //4.结点个数要加1
        size++;

    }

    @Override
    public void add(int i, E e) {
    //如果i小于0或者是大于size的话，增加不成功
      if (i<0 ||i >size){
          throw new RuntimeException("插入元素的位置不对");
      }
      //先构造一个新的结点出来
        Node<E> newNode = new Node<E>(e,null);

        //如果i等于0,应该是增加到链表的最开始的位置
        //先把原链表链接到新结点的后面
           newNode.next= start;
           //让新结点变成头结点
            start = newNode;

        //如果i=size，则应该增加到最后一个位置


        //其它的情况，两个结点之间插入一个新的结点
          //使用两个变量p和c 分别记录要插入位置的前一个结点和后一个结点
          Node<E> c ,p ;
          c = start;
          p = null;

          //使用循环，根据i的值定位p和c的位置
        int j = 0;
        while (c.next != null && j<i){
            p = c; //将p指向c当前的位置
            c = c.next; //c向后移动一位
            j++;
        }

          //找到p和c的位置后，将新结点插入两个结点之间
        if (j==i){
            p.next = newNode;
            newNode.next = c;
        }
    }

    @Override
    public void remove(int i) {

    }

    @Override
    public int indexOf(E e) {
        return 0;
    }

    @Override
    public E get(int i) {
        return null;
    }

    @Override
    public void edit(int i, E e) {

    }

    @Override
    public int getSize() {
        return 0;
    }

    @Override
    public void clear() {

    }

    @Override
    public boolean isEmpty() {
        return false;
    }
}
